import base64
import pickle
from django_redis import get_redis_connection

"""
1、获取到cookie数据
2、读取Redis的数据
3、合并之后形成新数据
    将Redis合并到中cookie
4、把新数据更新到Redis中
5、删除cookie数据

"""
"""
Redis和cookie合并形式：
    hash    {2:20, 3:10}  sku_id=2,个数=200， sku_id=3, 个数=10
    set     {2, 3}        选中2号和3号
    这样的话，就只需要将Redis和cookie的数据放到一个字典中，然后设置要哪个就行了
"""


def merge_cart_cookie_to_redis(request, user, response):
    """
    登录后合并cookie购物车数据到Redis
    :param request: 本次请求对象，获取cookie中的数据
    :param response: 本次响应对象，清除cookie中的数据
    :param user: 登录用户信息，获取user_id
    :return: response
    """
    # 1、获取到cookie数据
    cookie_str = request.COOKIES.get('carts')
    if cookie_str is None:
        return response
    else:
        carts = pickle.loads(base64.b64decode(cookie_str))
    # 2、初始化数据
    cookie_hash = {}
    selected_ids = []
    remove_selected_ids = []

    # 3、合并之后形成新数据
    for sku_id, count_selected_dict in carts.items():
        cookie_hash[sku_id] = count_selected_dict['count']
        if count_selected_dict['selected']:
            selected_ids.append(sku_id)
        else:
            remove_selected_ids.append(sku_id)
    #     将cookie合并到Redis中
    # 4、把新数据更新到Redis中
    redis_conn = get_redis_connection('carts')
    redis_conn.hmset('carts_%s' % user.id, cookie_hash)

    if len(selected_ids) > 0:
        redis_conn.sadd('selected_%s' % user.id, *selected_ids)  # *selected_ids 是解包
    if len(remove_selected_ids) > 0:
        redis_conn.srem('selected_%s' % user.id, *remove_selected_ids)

    # 5、删除cookie数据
    response.delete_cookie('carts')

    return response
